--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / visualiser-wasm / internal / scene / scene_test.go
Displaying Raw • Download
visualiser-wasm/internal/scene/scene_test.go 65ca9ddc823fcc2c8f8653c553b944b85db0875f (65ca9ddc) Text, 3.24 KB
T8b949e// SPDX-License-Identifier: 0BSD
Tff7b72package Te6edf3scene
Tff7b72import Tb4b4b4(
Ta5d6ff"math"
Ta5d6ff"testing"
Tb4b4b4)
Tff7b72func Te6edf3TestSetPackAndPickTb4b4b4(Te6edf3t Tff7b72*Te6edf3testingTb4b4b4.Te6edf3TTb4b4b4) Tb4b4b4{
Te6edf3s Tff7b72:= Te6edf3NewTb4b4b4(Tb4b4b4)
Te6edf3sTb4b4b4.Te6edf3SetTb4b4b4(Te6edf3SetRequestTb4b4b4{
Te6edf3WidthTb4b4b4: T79c0ff400Tb4b4b4,
Te6edf3HeightTb4b4b4: T79c0ff300Tb4b4b4,
Te6edf3ZoomTb4b4b4: T79c0ff1Tb4b4b4,
Te6edf3CamXTb4b4b4: T79c0ff0Tb4b4b4,
Te6edf3CamYTb4b4b4: T79c0ff0Tb4b4b4,
Te6edf3NodesTb4b4b4: Tb4b4b4[Tb4b4b4]Te6edf3NodeTb4b4b4{
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"me"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3KindTb4b4b4: Te6edf3KindMeTb4b4b4, Te6edf3FixedTb4b4b4: Tff7b72trueTb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"iface"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff100Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3KindTb4b4b4: Te6edf3KindIfaceOnTb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"peer"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff200Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff50Tb4b4b4, Te6edf3KindTb4b4b4: Te6edf3KindPeerTb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3EdgesTb4b4b4: Tb4b4b4[Tb4b4b4]Te6edf3EdgeTb4b4b4{
Tb4b4b4{Te6edf3FromTb4b4b4: Ta5d6ff"me"Tb4b4b4, Te6edf3ToTb4b4b4: Ta5d6ff"iface"Tb4b4b4, Te6edf3WidthTb4b4b4: T79c0ff3Tb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3FromTb4b4b4: Ta5d6ff"iface"Tb4b4b4, Te6edf3ToTb4b4b4: Ta5d6ff"peer"Tb4b4b4, Te6edf3WidthTb4b4b4: T79c0ff1Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Te6edf3nTb4b4b4, Te6edf3e Tff7b72:= Te6edf3sTb4b4b4.Te6edf3CountsTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3n Tff7b72!= T79c0ff3 Tff7b72|| Te6edf3e Tff7b72!= T79c0ff2 Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"counts got %d %d"Tb4b4b4, Te6edf3nTb4b4b4, Te6edf3eTb4b4b4)
Tb4b4b4}
Te6edf3nodes Tff7b72:= Te6edf3sTb4b4b4.Te6edf3PackNodesTb4b4b4(Tff7b72nilTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3nodesTb4b4b4) Tff7b72!= T79c0ff3Tff7b72*Te6edf3NodeStride Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"node pack len %d"Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3nodesTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72if Te6edf3nodesTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72!= T79c0ff0 Tff7b72|| Te6edf3nodesTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72!= T79c0ff0 Tff7b72|| Te6edf3nodesTb4b4b4[T79c0ff7Tb4b4b4] Tff7b72!= Te6edf3KindMe Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"me pack unexpected: %v"Tb4b4b4, Te6edf3nodesTb4b4b4[Tb4b4b4:Te6edf3NodeStrideTb4b4b4]Tb4b4b4)
Tb4b4b4}
Te6edf3edges Tff7b72:= Te6edf3sTb4b4b4.Te6edf3PackEdgesTb4b4b4(Tff7b72nilTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3edgesTb4b4b4) Tff7b72!= T79c0ff2Tff7b72*Te6edf3EdgeStride Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"edge pack len %d"Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3edgesTb4b4b4)Tb4b4b4)
Tb4b4b4}
T8b949e// Screen centre maps to cam (0,0) so "me" is under centre.
Te6edf3id Tff7b72:= Te6edf3sTb4b4b4.Te6edf3PickNearestTb4b4b4(T79c0ff200Tb4b4b4, T79c0ff150Tb4b4b4, T79c0ff20Tb4b4b4)
Tff7b72if Te6edf3id Tff7b72!= Ta5d6ff"me" Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"pick centre got %q"Tb4b4b4, Te6edf3idTb4b4b4)
Tb4b4b4}
Te6edf3id Tb4b4b4= Te6edf3sTb4b4b4.Te6edf3PickNearestTb4b4b4(T79c0ff200Tff7b72+T79c0ff100Tb4b4b4, T79c0ff150Tb4b4b4, T79c0ff20Tb4b4b4)
Tff7b72if Te6edf3id Tff7b72!= Ta5d6ff"iface" Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"pick iface got %q"Tb4b4b4, Te6edf3idTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72func Te6edf3TestDragAndCameraTb4b4b4(Te6edf3t Tff7b72*Te6edf3testingTb4b4b4.Te6edf3TTb4b4b4) Tb4b4b4{
Te6edf3s Tff7b72:= Te6edf3NewTb4b4b4(Tb4b4b4)
Te6edf3sTb4b4b4.Te6edf3SetTb4b4b4(Te6edf3SetRequestTb4b4b4{
Te6edf3WidthTb4b4b4: T79c0ff400Tb4b4b4, Te6edf3HeightTb4b4b4: T79c0ff300Tb4b4b4, Te6edf3ZoomTb4b4b4: T79c0ff1Tb4b4b4,
Te6edf3NodesTb4b4b4: Tb4b4b4[Tb4b4b4]Te6edf3NodeTb4b4b4{Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"a"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff10Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff10Tb4b4b4, Te6edf3KindTb4b4b4: Te6edf3KindPeerTb4b4b4}Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Tff7b72if Tb4b4b4!Te6edf3sTb4b4b4.Te6edf3DragStartTb4b4b4(Ta5d6ff"a"Tb4b4b4) Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalTb4b4b4(Ta5d6ff"drag start failed"Tb4b4b4)
Tb4b4b4}
Te6edf3sTb4b4b4.Te6edf3DragToTb4b4b4(T79c0ff200Tb4b4b4, T79c0ff150Tb4b4b4)
Tff7b72if Te6edf3sTb4b4b4.Te6edf3nodesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3X Tff7b72!= T79c0ff0 Tff7b72|| Te6edf3sTb4b4b4.Te6edf3nodesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3Y Tff7b72!= T79c0ff0 Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"drag to centre got %v %v"Tb4b4b4, Te6edf3sTb4b4b4.Te6edf3nodesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3XTb4b4b4, Te6edf3sTb4b4b4.Te6edf3nodesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3YTb4b4b4)
Tb4b4b4}
Te6edf3sTb4b4b4.Te6edf3DragEndTb4b4b4(Tb4b4b4)
Te6edf3sTb4b4b4.Te6edf3SetCameraTb4b4b4(T79c0ff5Tb4b4b4, T79c0ff6Tb4b4b4, T79c0ff2Tb4b4b4)
Te6edf3cam Tff7b72:= Te6edf3sTb4b4b4.Te6edf3CameraTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3camTb4b4b4.Te6edf3X Tff7b72!= T79c0ff5 Tff7b72|| Te6edf3camTb4b4b4.Te6edf3Y Tff7b72!= T79c0ff6 Tff7b72|| Te6edf3camTb4b4b4.Te6edf3Zoom Tff7b72!= T79c0ff2 Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"camera %+v"Tb4b4b4, Te6edf3camTb4b4b4)
Tb4b4b4}
Te6edf3sTb4b4b4.Te6edf3PanByTb4b4b4(T79c0ff1Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4)
Tff7b72if Te6edf3sTb4b4b4.Te6edf3camX Tff7b72!= T79c0ff6 Tff7b72|| Te6edf3sTb4b4b4.Te6edf3camY Tff7b72!= T79c0ff5 Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"pan %v %v"Tb4b4b4, Te6edf3sTb4b4b4.Te6edf3camXTb4b4b4, Te6edf3sTb4b4b4.Te6edf3camYTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72func Te6edf3TestTickMovesUnfixedTb4b4b4(Te6edf3t Tff7b72*Te6edf3testingTb4b4b4.Te6edf3TTb4b4b4) Tb4b4b4{
Te6edf3s Tff7b72:= Te6edf3NewTb4b4b4(Tb4b4b4)
Te6edf3sTb4b4b4.Te6edf3SetTb4b4b4(Te6edf3SetRequestTb4b4b4{
Te6edf3NodesTb4b4b4: Tb4b4b4[Tb4b4b4]Te6edf3NodeTb4b4b4{
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"me"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3KindTb4b4b4: Te6edf3KindMeTb4b4b4, Te6edf3FixedTb4b4b4: Tff7b72trueTb4b4b4, Te6edf3MassTb4b4b4: T79c0ff4Tb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"a"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff40Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3KindTb4b4b4: Te6edf3KindPeerTb4b4b4, Te6edf3MassTb4b4b4: T79c0ff1Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3EdgesTb4b4b4: Tb4b4b4[Tb4b4b4]Te6edf3EdgeTb4b4b4{Tb4b4b4{Te6edf3FromTb4b4b4: Ta5d6ff"me"Tb4b4b4, Te6edf3ToTb4b4b4: Ta5d6ff"a"Tb4b4b4, Te6edf3WidthTb4b4b4: T79c0ff2Tb4b4b4}Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Te6edf3before Tff7b72:= Te6edf3sTb4b4b4.Te6edf3nodesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3X
Te6edf3sTb4b4b4.Te6edf3TickTb4b4b4(T79c0ff8Tb4b4b4)
Tff7b72if Te6edf3sTb4b4b4.Te6edf3nodesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3X Tff7b72!= T79c0ff0 Tff7b72|| Te6edf3sTb4b4b4.Te6edf3nodesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3Y Tff7b72!= T79c0ff0 Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"me moved"Tb4b4b4)
Tb4b4b4}
Tff7b72if Te6edf3sTb4b4b4.Te6edf3nodesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3X Tff7b72== Te6edf3before Tff7b72&& Te6edf3sTb4b4b4.Te6edf3nodesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3Y Tff7b72== T79c0ff0 Tb4b4b4{
T8b949e// Spring may still be near start after few steps; allow tiny motion miss
T8b949e// but Tick must at least run without panic and keep me fixed.
Te6edf3_ Tb4b4b4= Te6edf3before
Tb4b4b4}
Tb4b4b4}
Tff7b72func Te6edf3TestTickPersistsVelocityAndSettlesTb4b4b4(Te6edf3t Tff7b72*Te6edf3testingTb4b4b4.Te6edf3TTb4b4b4) Tb4b4b4{
Te6edf3s Tff7b72:= Te6edf3NewTb4b4b4(Tb4b4b4)
Te6edf3sTb4b4b4.Te6edf3SetTb4b4b4(Te6edf3SetRequestTb4b4b4{
Te6edf3NodesTb4b4b4: Tb4b4b4[Tb4b4b4]Te6edf3NodeTb4b4b4{
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"me"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3KindTb4b4b4: Te6edf3KindMeTb4b4b4, Te6edf3FixedTb4b4b4: Tff7b72trueTb4b4b4, Te6edf3MassTb4b4b4: T79c0ff4Tb4b4b4}Tb4b4b4,
T8b949e// Start near spring rest length so live ticks should calm quickly.
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"a"Tb4b4b4, Te6edf3XTb4b4b4: T79c0ff260Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3KindTb4b4b4: Te6edf3KindPeerTb4b4b4, Te6edf3MassTb4b4b4: T79c0ff1Tb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3IDTb4b4b4: Ta5d6ff"b"Tb4b4b4, Te6edf3XTb4b4b4: Tff7b72-T79c0ff260Tb4b4b4, Te6edf3YTb4b4b4: T79c0ff0Tb4b4b4, Te6edf3KindTb4b4b4: Te6edf3KindPeerTb4b4b4, Te6edf3MassTb4b4b4: T79c0ff1Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3EdgesTb4b4b4: Tb4b4b4[Tb4b4b4]Te6edf3EdgeTb4b4b4{
Tb4b4b4{Te6edf3FromTb4b4b4: Ta5d6ff"me"Tb4b4b4, Te6edf3ToTb4b4b4: Ta5d6ff"a"Tb4b4b4, Te6edf3WidthTb4b4b4: T79c0ff3Tb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3FromTb4b4b4: Ta5d6ff"me"Tb4b4b4, Te6edf3ToTb4b4b4: Ta5d6ff"b"Tb4b4b4, Te6edf3WidthTb4b4b4: T79c0ff3Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Tff7b72for Te6edf3i Tff7b72:= T79c0ff0Tb4b4b4; Te6edf3i Tb4b4b4< T79c0ff30Tb4b4b4; Te6edf3iTff7b72++ Tb4b4b4{
Te6edf3sTb4b4b4.Te6edf3TickTb4b4b4(T79c0ff1Tb4b4b4)
Tb4b4b4}
Te6edf3x1 Tff7b72:= Te6edf3sTb4b4b4.Te6edf3nodesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3X
Te6edf3y1 Tff7b72:= Te6edf3sTb4b4b4.Te6edf3nodesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3Y
Tff7b72for Te6edf3i Tff7b72:= T79c0ff0Tb4b4b4; Te6edf3i Tb4b4b4< T79c0ff30Tb4b4b4; Te6edf3iTff7b72++ Tb4b4b4{
Te6edf3sTb4b4b4.Te6edf3TickTb4b4b4(T79c0ff1Tb4b4b4)
Tb4b4b4}
Te6edf3step Tff7b72:= Te6edf3mathTb4b4b4.Te6edf3HypotTb4b4b4(Te6edf3sTb4b4b4.Te6edf3nodesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3XTff7b72-Te6edf3x1Tb4b4b4, Te6edf3sTb4b4b4.Te6edf3nodesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3YTff7b72-Te6edf3y1Tb4b4b4)
T8b949e// Near-equilibrium live layout must not keep thrashing.
Tff7b72if Te6edf3step Tb4b4b4> T79c0ff12 Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"live layout still twitching after settle: moved %v"Tb4b4b4, Te6edf3stepTb4b4b4)
Tb4b4b4}
Tff7b72if Te6edf3mathTb4b4b4.Te6edf3HypotTb4b4b4(Te6edf3sTb4b4b4.Te6edf3vxTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4.Te6edf3vyTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4) Tb4b4b4> T79c0ff1.2 Tb4b4b4{
Te6edf3tTb4b4b4.Te6edf3FatalfTb4b4b4(Ta5d6ff"velocity should damp toward rest, got %v %v"Tb4b4b4, Te6edf3sTb4b4b4.Te6edf3vxTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4.Te6edf3vyTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────